Complex software systems comprising a large number of different and to some extent interacting modules are often created by a plurality of programmers. The problem often arises here that the performance of the software system is unsatisfactory. As a complex software system is not easy to understand, the problem is often to decide which module or modules of the software system need to be optimized in order to enable the performance to be improved or resource consumption such as e.g. memory requirement to be reduced. It is possible, for example, to identify the module or modules constituting a resource shortfall, a performance problem or a bottleneck. In general, however, it cannot be estimated how the performance of the software system or the total resource consumption of the resource system will change when the module or modules in question are optimized.
Profiler data can be used in simple software systems, particularly so-called single-threaded systems, using methods without side effects in order to obtain an estimate as to the extent to which optimization of the software system will affect its runtime characteristics. One disadvantage, however, is that this is only possible for simple systems such as single-threaded systems. In particular, side effects cannot be taken into account.
Current programmer practice for optimizing the software system is to comment out or simulate modules which could be the cause of the performance problem and therefore estimate their contribution to performance. However, this approach is not possible in complex systems due to functional dependencies in the software code.
Also known is so-called “snapshot differencing”. With this method the volatility of the software code can be dealt with by creating a snapshot of the unchanged and of a changed software code. However, this procedure requires in some cases very complex/costly reengineering of the software system under examination.